package com.cskaoyan.javase.oop1._11static._0introduction._1new;

/**
 * 静态成员变量：
 * 是一种被全体对象共享，属于类的变量，存储在一片能够被全体对象所共享的内存区域。
 * 而不像成员变量一样，存储在对象当中！！
 *
 * 被static修饰的成员变量称之为"静态成员变量"
 * 语法:
 * 首先它仍然定义在类的成员位置
 * [访问权限修饰符] static 数据类型 变量名;
 * 注: 访问权限修饰符没有学习,这里先默认省略它.
 *
 * 特点:
 *      1.和成员变量一样,同样具有默认初始化,具有默认值
 *          而且默认初始化的步骤同样永远最先进行
 *          静态成员变量永远最先有默认值
 *          各种数据类型的默认值和成员变量一样
 *
 *          同样可以显式赋值
 *          并且显式赋值也会覆盖默认值
 *
 *      2.静态成员变量不属于对象,而属于类
 *          所以不要使用,禁止使用对象名点访问静态成员变量
 *          而是要使用"类名."访问它们
 *
 *      3.静态成员变量无需依赖于对象,即便没有对象,直接使用"类名."也可以访问它们
 *
 *
 * static同样可以用来修饰成员方法,表示"静态成员方法"
 * 语法:
 * [访问权限修饰符] static 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 注: 修饰符列表先默认是public
 * 特点:
 *      1.同样可以使用"类名."访问静态成员方法
 *          不需要创建对象,也不需要依赖于对象
 *          特殊的,当访问同类中static方法时,可以省略类名.
 *
 *      2.同样不依赖于对象,没有对象也可以调用静态成员方法.
 *
 * 以上,静态成员变量/方法都是属于类的
 * 不需要创建对象,直接使用类名点就可以访问它们
 * 静态成员变量/方法,合起来称之为类的静态成员
 *
 * 为什么静态成员有以上特点呢?
 *
 * @since 09:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*WangDaoStudent s1 = new WangDaoStudent("张三", 18, 10, "男");
        WangDaoStudent s2 = new WangDaoStudent("李四", 18, 20, "男");

        // Static member 'com.cskaoyan.javase.oop1._11static._0introduction._1new.WangDaoStudent.schoolName' accessed via instance reference
        // 使用对象的引用访问静态成员 是禁止使用的 不合适
        System.out.println(s1.schoolName);
        s1.schoolName = "C++43期";
        System.out.println(s2.schoolName);*/

        System.out.println(WangDaoStudent.schoolName);
        WangDaoStudent.testStatic();

        Demo.testStatic();
        testStatic();

    }

    public static void testStatic(){}
}

class WangDaoStudent {
    String name;
    int age;
    int stuId;
    /*
        性别这个属性,建议使用String类型的变量
        不推荐使用布尔类型的isMale或者isMale来做性别
        (原因后面再说)
     */
    String gender;
    static String schoolName = "Java41th";


    public void eat() {
        System.out.println("我要吃饭!");
    }

    public void study() {
        System.out.println("吃完饭再学习!");
    }

    public WangDaoStudent(String name, int age, int stuId, String gender) {
        this.name = name;
        this.age = age;
        this.stuId = stuId;
        this.gender = gender;
    }

    public WangDaoStudent() {
    }


    // 静态成员方法
    public static void testStatic(){}
}